package org.example.dataStorage.Json.hutool;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;



public class JsonFileUtils {
    //JSON 保存文件路径
    public static final String JSON_FILE_UTILS_PATH = "./DataFile/json/";

    /**
     * 保存JSON数据到文件
     *
     * @param parentFolderName 上一级文件夹名称
     * @param jsonData         要保存的JSON数据
     */
    public static void saveJsonToFile(String parentFolderName, Object jsonData) {
        // 获取时间
        LocalDateTime date = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); // get the current date

        // 时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss");

        // 2025-3-27
        String uploadFormat = date.format(formatter);

        // 创建时间格式化的文件名
        String fileName = uploadFormat + ".json";

        // 构建完整路径
        Path fullPath = Paths.get(JSON_FILE_UTILS_PATH , parentFolderName, fileName);
        try {
            // 确保父目录存在
            Files.createDirectories(fullPath.getParent());
            String jsonStr = JSONUtil.toJsonPrettyStr(jsonData);
            // 将JSON数据写入文件
            FileUtil.writeString(jsonStr, fullPath.toAbsolutePath().toString(), "UTF-8");

        } catch (IOException e) {
            System.err.printf("创建失败%s}", e.getMessage());
        }
    }
    private static <T> T readJsonFromFileToObject(Path fullPath, Class<T> clazz, boolean isDelete) {
        // 构建完整路径
        try {
            // 确保父目录存在
            Files.createDirectories(fullPath.getParent());
            // 读取JSON数据
            T bean = JSONUtil.toBean(FileUtil.readUtf8String(fullPath.toAbsolutePath().toString()), clazz);
            if (isDelete) {
                FileUtil.del(fullPath);
            }
            return bean;
        } catch (IOException e) {
            System.err.printf("读取失败%s}", e.getMessage());
        }
        return null;
    }

    /**
     * 读取JSON数据从文件 并转为对象
     *
     * @param parentFolderName 上一级文件夹名称
     * @param fileName         文件名称
     * @param clazz            要转换的对象
     * @param isDelete         读取后是否删除
     * @return JSON数据
     */
    public static <T> T readJsonFromFileToObject(String parentFolderName, String fileName, Class<T> clazz, boolean isDelete) {

        // 构建完整路径
        Path fullPath = Paths.get(JSON_FILE_UTILS_PATH, parentFolderName, fileName);

        return readJsonFromFileToObject(fullPath, clazz, isDelete);
    }




    /**
     * 循环 读取 JSON数据从文件 并转为对象
     *
     * @param parentFolderName 上一级文件夹名称
     * @param clazz            要转换的对象
     * @param isDelete          读取后是否删除
     * @return JSON数据
     */
    public static <T> List<T> readJsonFromFileToObject(String parentFolderName, Class<T> clazz, boolean isDelete) {

        Path fullPath = Paths.get(JSON_FILE_UTILS_PATH, parentFolderName);
        if (!fullPath.toFile().exists()) {
            return new ArrayList<>();
        }
        //读取文件下的文件
        List<Path> filesInDir = Arrays.stream(FileUtil.ls(fullPath.toAbsolutePath().toString()))
                .filter(File::isFile) // 只保留文件，排除目录
                .map(File::toPath)
                .toList();

        return filesInDir.stream()
                .map(e -> readJsonFromFileToObject(e, clazz, isDelete))
                .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        saveJsonToFile("测试", Map.of("X",12,"y",23));
        List<Object> list = readJsonFromFileToObject("测试", Object.class, false);
        String string = Arrays.toString(list.toArray());
        System.out.println(string);
    }
}
